package stendcontrol;

public class MeasureSeqMessage extends AbstractMessage {

    /**
     * Количество измерений
     */
    protected int cnt_msr_msg = 0;
    /**
     * Максимальное количество измерений в последовательности
     */
    protected final int max_msr_msg = Configurator.MAX_SIZE_MEASURE_SEQUENCE;
    /**
     * Количество датчиков в системе
     */
    protected final int cnt_sensors = Configurator.COUNT_SENSOR;
    /**
     * Буфер хранения значений датчиков [N сенсора][N измерения]
     */
    protected int[][] sensors = new int[cnt_sensors][max_msr_msg];
    /**
     * Буфер хранения позиций измерений
     */
    protected long[] position = new long[max_msr_msg];
    protected MeasureSeqMessage prev_measure_seq;
    protected MeasureSeqMessage next_measure_seq;

    /**
     * Создание новой последовательности измерений
     *
     * @param prev_measure_seq - предыдущая последовательность измерений
     */
    public MeasureSeqMessage(MeasureSeqMessage prev_measure_seq) {
        this.prev_measure_seq = prev_measure_seq;
    }

    /**
     * Установить следующюю последовательность измерений
     *
     * @param n_msm - следующий объект последовательности измерений
     */
    public void setNextMeasureSeqMessage(MeasureSeqMessage n_msm) {
        this.next_measure_seq = n_msm;
    }

    /**
     * Добавить измерение в последовательность измерений
     *
     * @param sensors - массив значений датчиков
     * @param position - позиция измерения
     */
    public void addMeasure(int[] sensors, long position) {
        if (cnt_msr_msg < max_msr_msg) {
            if (sensors.length == cnt_sensors) {
                /*System.arraycopy(sensors, 0,
                        this.sensors[cnt_msr_msg], 0, cnt_sensors);*/
                for (int i = 0; i < cnt_sensors; i++) {
                    this.sensors[i][cnt_msr_msg] = sensors[i];
                }
                this.position[cnt_msr_msg] = position;
                cnt_msr_msg++;
            } else {
                StendLogger.log(StendLogger.MSG_ERROR, "Bad count "
                        + "sensors :" + sensors.length
                        + " need:" + cnt_sensors);
            }
        } else {
            StendLogger.log(StendLogger.MSG_ERROR, "Add in full "
                    + "MeasureSeqMessage max:" + max_msr_msg
                    + " cnt:" + cnt_msr_msg);
        }
    }

    /**
     * Operation Получить количество измерений в последовательности
     *
     * @return Количество измерений
     */
    public int getSize() {
        return cnt_msr_msg;
    }

    /**
     * Operation Возвращает значение датчика в момент конкретного измерения
     *
     * @param nsensor - номер датчика
     * @param n - номер измерения
     * @return int - значение датчика
     */
    public int getSensorValue(int nsensor, int n) {
        if (n < cnt_msr_msg && n >= 0 && nsensor >= 0 && nsensor < cnt_sensors) {
            return sensors[nsensor][n];
        } else {
            StendLogger.log(StendLogger.MSG_ERROR, "Bad number of sensor or "
                    + "measure. N_sensor:" + nsensor
                    + " N_measure:" + n);
            return -1;
        }
    }

    /**
     * Operation Возвращает значение позиции индентора в конкретный момент
     * измерения
     *
     * @param n - номер измерения
     * @return позиция индентора во время измерения
     */
    public long getPosition(int n) {
        if (n < cnt_msr_msg && n >= 0) {
            return position[n];
        } else {
            StendLogger.log(StendLogger.MSG_ERROR, "Bad number of measure "
                    + " N_measure:" + n);
            return -1;
        }
    }

    /**
     * Возвращает предыдущую последовательность измерений
     *
     * @return Предыдущая последовательность измерений
     */
    public MeasureSeqMessage getPrevMeasureSeq() {
        return prev_measure_seq;
    }

    /**
     * Возвращает следующую последовательность измерений
     *
     * @return Следующая последовательность измерений
     */
    public MeasureSeqMessage getNextMeasureSeq() {
        return next_measure_seq;
    }

    @Override
    public int getTypeMsg() {
        return AbstractMessage.MSG_MSEQ;
    }
}
